4.1.2 容器

到目前为止,读者已经拥有一个拉取到本地的镜像,可以使用 docker container run 命令从镜像来启动容器。

在Linux中启动容器的命令如下。

$ docker container run -it ubuntu:latest /bin/bash
root@6dc20d508db0:/#

在Windows中启动容器的命令如下。

> docker container run -it microsoft/powershell:nanoserver pwsh.exe
Windows PowerShell
Copyright (C) 2016 Microsoft Corporation. All rights reserved.
PS C:\>

仔细观察上面命令的输出内容,会注意到每个实例中的提示符都发生了变化。这是因为 -it 参数会将Shell切换到容器终端——现在已经位于容器内部了!

接下来分析一下 docker container run 命令。 docker container run 告诉Docker daemon启动新的容器。其中 -it 参数告诉Docker开启容器的交互模式并将读者当前的Shell连接到容器终端(在容器章节中会详细介绍)。接下来,命令告诉Docker,用户想基于 ubuntu:latest 镜像启动容器(如果用户使用Windows,则是基于 microsoft/powershell:nanoserver 镜像)。最后,命令告诉Docker,用户想要在容器内部运行哪个进程。对于Linux示例来说是运行Bash Shell,对于Windows示例来说则是运行PowerShell。

在容器内部运行 ps 命令查看当前正在运行的全部进程。

Linux示例如下。

root@6dc20d508db0:/# ps -elf
F S UID    PID  PPID   NI ADDR SZ WCHAN  STIME TTY  TIME CMD
4 S root     1     0    0 -  4560 wait   13:38 ?    00:00:00 /bin/bash
0 R root     9     1    0 -  8606 -      13:38 ?    00:00:00 ps -elf

Windows示例如下。

PS C:\> ps
Handles   NPM(K)   PM(K)   WS(K)   CPU(s)     Id   SI ProcessName
-------   ------   -----   -----   ------     --   -- -----------
      0        5     964    1292     0.00   4716    4 CExecSvc
      0        5     592     956     0.00   4524    4 csrss
      0        0       0       4               0    0 Idle
      0       18    3984    8624     0.13    700    4 lsass
      0       52   26624   19400     1.64   2100    4 powershell
      0       38   28324   49616     1.69   4464    4 powershell
      0        8    1488    3032     0.06   2488    4 services
      0        2     288     504     0.00   4508    0 smss
      0        8    1600    3004     0.03    908    4 svchost
      0       12    1492    3504     0.06   4572    4 svchost
      0       15   20284   23428     5.64   4628    4 svchost
      0       15    3704    7536     0.09   4688    4 svchost
      0       28    5708    6588     0.45   4712    4 svchost
      0       10    2028    4736     0.03   4840    4 svchost
      0       11    5364    4824     0.08   4928    4 svchost
      0        0     128     136    37.02      4    0 System
      0        7     920    1832     0.02   3752    4 wininit
      0        8    5472   11124     0.77   5568    4 WmiPrvSE

Linux容器中仅包含两个进程。

  • PID 1:代表 /bin/bash 进程,该进程是通过 docker container run 命令来通知容器运行的。
  • PID 9:代表 ps -elf 进程,查看当前运行中进程所使用的命令/程序。

命令输出中展示的 ps -elf 进程存在一定的误导,因为这个程序在 ps 命令退出后就结束了。这意味着容器内长期运行的进程其实只有 /bin/bash

Windows 容器运行中的进程会更多,这是由 Windows 操作系统工作方式决定的。虽然Windows容器中的进程比Linux容器要多,但与常见的Windows服务器相比,其进程数量却是明显偏少的。

Ctrl-PQ组合键 ,可以在退出容器的同时还保持容器运行。这样Shell就会返回到Docker主机终端。可以通过查看Shell提示符来确认。

现在读者已经返回到Docker主机的Shell提示符,再次运行 ps 命令。

Linux示例如下。

$ ps -elf
F S UID       PID  PPID    NI ADDR SZ WCHAN  TIME CMD
4 S root        1     0     0 -  9407 -      00:00:03 /sbin/init
1 S root        2     0     0 -     0 -      00:00:00 [kthreadd]
1 S root        3     2     0 -     0 -      00:00:00 [ksoftirqd/0]
1 S root        5     2     -20     0 -      00:00:00 [kworker/0:0H]
1 S root        7     2    -0 -     0 -      00:00:00 [rcu_sched]
<Snip>
0 R ubuntu  22783 22475     0 -  9021 -      00:00:00 ps -elf

Windows示例如下。

> ps
Handles   NPM(K)    PM(K)    WS(K)    CPU(s)     Id  SI ProcessName
-------   ------    -----    -----    ------     --  -- -----------
    220       11     7396     7872      0.33   1732   0 amazon-ssm-agen
     84        5      908     2096      0.00   2428   3 CExecSvc
     87        5      936     1336      0.00   4716   4 CExecSvc
    203       13     3600    13132      2.53   3192   2 conhost
    210       13     3768    22948      0.08   5260   2 conhost
    257       11     1808      992      0.64    524   0 csrss
    116        8     1348       580     0.08    592   1 csrss
     85        5      532      1136     0.23   2440   3 csrss
    242       11     1848       952     0.42   2708   2 csrss
     95        5      592       980     0.00   4524   4 csrss
    137        9     7784      6776     0.05   5080   2 docker
    401       17    22744     14016    28.59   1748   0 dockerd
    307       18    13344      1628     0.17    936   1 dwm
    <SNIP>
   1888        0      128       136    37.17      4   0 System
    272       15     3372      2452     0.23   3340   2 TabTip
     72        7     1184         8     0.00   3400   2 TabTip32
    244       16     2676      3148     0.06   1880   2 taskhostw
    142        7     6172      6680     0.78   4952   3 WmiPrvSE
    148        8     5620     11028     0.77   5568   4 WmiPrvSE

可以看到与容器相比,Docker主机中运行的进程数要多很多。Windows容器中运行的进程要远少于Windows主机,Linux容器中的进程数也远少于Linux主机。

在之前的步骤当中,是使用 Ctrl-PQ组合键 来退出容器的。在容器内部使用该操作可以退出当前容器,但不会杀死容器进程。读者可以通过 docker container ls 命令查看系统内全部处于运行状态的容器。

$ docker container ls
CONTAINER ID   IMAGE          COMMAND      CREATED  STATUS    NAMES
e2b69eeb55cb   ubuntu:latest  "/bin/bash"  7 mins   Up 7 min  vigilant_borg

上述的输出显示只有一个运行中的容器。这就是前面示例中创建的那个容器。输出中有该容器,证明了容器在退出后依然是运行的。读者可以看到这个进程是7min之前创建的,并且一直在运行。

results matching ""

    No results matching ""